package nl.ruudshuis.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;

import nl.ruudshuis.beans.VeilingBean;
import nl.ruudshuis.db.DBmanager;

public class VeilingDao {

	private String selectAll = "SELECT * FROM VEILING WHERE eindtijd - ? > 1 ORDER BY eindtijd ASC FETCH NEXT ? ROWS ONLY";
	private String insert = "INSERT INTO VEILING (verkoper, imgPath, titel, omschrijving, prijs, eindtijd) VALUES(?,?,?,?,?,?)";
	private String mijnVeilingen = "SELECT * FROM VEILING WHERE verkoper = ? ORDER BY eindtijd DESC";
	private String getMijnVeiling = "SELECT * FROM VEILING WHERE verkoper= ? AND veilingId = ?";
	private String getVeiling = "SELECT * FROM VEILING WHERE veilingId = ?";
	private String update = "UPDATE VEILING SET omschrijving = ?, imgPath = ? WHERE veilingId = ? AND verkoper = ?";
	private String zoek = "SELECT * FROM VEILING WHERE titel LIKE ? ORDER BY eindtijd ASC";
	
	private DBmanager myDb;
	private Connection con = null;
	
	private PreparedStatement psRead = null;
	private PreparedStatement psInsert = null;
	private PreparedStatement psMijnVeilingen = null;
	private PreparedStatement psGetVeiling = null;
	private PreparedStatement psUpdate = null;
	private PreparedStatement psZoek = null;
	private PreparedStatement psGetMijnVeiling = null;

	public VeilingDao(DBmanager db) {
		myDb = db;
		con = myDb.getConnection();
		try {
			this.psRead 		 = con.prepareStatement(selectAll);
			this.psInsert		 = con.prepareStatement(insert);
			this.psMijnVeilingen = con.prepareStatement(mijnVeilingen);
			this.psGetVeiling    = con.prepareStatement(getVeiling);
			this.psUpdate 	 = con.prepareStatement(update);
			this.psZoek 		 = con.prepareStatement(zoek);
			this.psGetMijnVeiling = con.prepareStatement(getMijnVeiling);
			
		} catch (SQLException se) {
			printSQLException(se);
			se.printStackTrace();
		}
	}
	
	public void updateVeiling(String omschrijving, String imgPath, int veilingId, int userId){
		try {
		psUpdate.clearParameters();
		
		psUpdate.setString(1, omschrijving);
		psUpdate.setString(2, imgPath);
		psUpdate.setInt(3,veilingId);
		psUpdate.setInt(4, userId);
		
		int resultaat = psUpdate.executeUpdate();
		if(resultaat == 0){
			System.out.println("nix done");
		}
		
		} catch (SQLException se) {
			printSQLException(se);
		}
		
	}
	public VeilingBean getMijnVeiling(int userId, int veiling){
		VeilingBean v = null;
		try {
			psGetMijnVeiling.clearParameters();
			psGetMijnVeiling.setInt(1, userId);
			psGetMijnVeiling.setInt(2, veiling);
			ResultSet rs = psGetMijnVeiling.executeQuery();
			GebruikersDao g = new GebruikersDao(myDb);

			if (rs.next()) {
				int veilingId = rs.getInt("veilingId");
				String imgPath = rs.getString("imgpath");
				String titel = rs.getString("titel");
				String omschrijving = rs.getString("omschrijving");
				double prijs = rs.getDouble("prijs");
				long eindtijd = rs.getLong("eindtijd");
				long huidig = System.currentTimeMillis();
				long tijdover = eindtijd-huidig;
				if(tijdover< 0){
					tijdover = 0;
				}
			
				v = new VeilingBean();
				
				v.setAll(veilingId, g.getGebruikerOpID(userId), imgPath, titel, omschrijving, prijs, tijdover);
				
			}

			rs.close();

		} catch (SQLException se) {
			printSQLException(se);
		}
		return v;
	}
	
	public LinkedList<VeilingBean> zoekVeilingen(String zoekopdracht){
		LinkedList<VeilingBean> veilingen = new LinkedList<VeilingBean>();

		try {
			psZoek.clearParameters();
			psZoek.setString(1, "%" + zoekopdracht + "%");
			ResultSet rs = psZoek.executeQuery();
			GebruikersDao g = new GebruikersDao(myDb);
			
			while (rs.next()) {
				int id = rs.getInt("veilingId");
				int verkoper = rs.getInt("verkoper");
				String imgPath = rs.getString("imgPath");
				String titel = rs.getString("titel");
				String omschrijving = rs.getString("omschrijving");
				double prijs = rs.getDouble("prijs");
				long eindtijd = rs.getLong("eindtijd");
				long huidig = System.currentTimeMillis();
				long tijdover = eindtijd-huidig;
				
				VeilingBean v = new VeilingBean();
				
				v.setAll(id, g.getGebruikerOpID(verkoper), imgPath, titel, omschrijving, prijs, tijdover);
				veilingen.add(v);
			}

			rs.close();

		} catch (SQLException se) {
			printSQLException(se);
		}

		return veilingen;
	}
	
	public double getPrijsVanVeiling(int veilingId){
		VeilingBean v = getVeilingOpId(veilingId);
		return v.getPrijs();
	}

	public LinkedList<VeilingBean> getVeilingen(int numRows) {

		LinkedList<VeilingBean> veilingen = new LinkedList<VeilingBean>();

		try {
			psRead.clearParameters();
			psRead.setLong(1, System.currentTimeMillis());
			psRead.setInt(2, numRows);
			ResultSet rs = psRead.executeQuery();
			GebruikersDao g = new GebruikersDao(myDb);
			
			while (rs.next()) {
				int id = rs.getInt("veilingId");
				int verkoper = rs.getInt("verkoper");
				String imgPath = rs.getString("imgPath");
				String titel = rs.getString("titel");
				String omschrijving = rs.getString("omschrijving");
				double prijs = rs.getDouble("prijs");
				long eindtijd = rs.getLong("eindtijd");
				long huidig = System.currentTimeMillis();
				long tijdover = eindtijd-huidig;
				
				VeilingBean v = new VeilingBean();
				
				v.setAll(id, g.getGebruikerOpID(verkoper), imgPath, titel, omschrijving, prijs, tijdover);
				veilingen.add(v);
			}

			rs.close();

		} catch (SQLException se) {
			printSQLException(se);
		}

		return veilingen;
	}
	
	public LinkedList<VeilingBean> getMijnVeilingen(int verkoper) {

		LinkedList<VeilingBean> veilingen = new LinkedList<VeilingBean>();		

		try {
			psMijnVeilingen.setInt(1, verkoper);
			ResultSet rs = psMijnVeilingen.executeQuery();
			GebruikersDao g = new GebruikersDao(myDb);

			while (rs.next()) {
				int veilingId = rs.getInt("veilingId");
				String imgPath = rs.getString("imgpath");
				String titel = rs.getString("titel");
				String omschrijving = rs.getString("omschrijving");
				double prijs = rs.getDouble("prijs");
				long eindtijd = rs.getLong("eindtijd");
				long huidig = System.currentTimeMillis();
				long tijdover = eindtijd-huidig;
				if(tijdover< 0){
					tijdover = 0;
				}
			
				VeilingBean v = new VeilingBean();
				
				v.setAll(veilingId, g.getGebruikerOpID(verkoper), imgPath, titel, omschrijving, prijs, tijdover);
				veilingen.add(v);
			}

			rs.close();

		} catch (SQLException se) {
			printSQLException(se);
		}

		return veilingen;
	}	
	
	public VeilingBean getVeilingOpId(int veilingId){
		VeilingBean v = null;
		GebruikersDao g = new GebruikersDao(myDb);

		try {
			psGetVeiling.setInt(1, veilingId);
			ResultSet rs = psGetVeiling.executeQuery();

			if (rs.next()) {
				int verkoper = rs.getInt("verkoper");
				String imgPath = rs.getString("imgpath");
				String titel = rs.getString("titel");
				String omschrijving = rs.getString("omschrijving");
				double prijs = rs.getDouble("prijs");
				long eindtijd = rs.getLong("eindtijd");
				long huidig = System.currentTimeMillis();
				long tijdover = eindtijd-huidig;
				if(tijdover< 0){
					tijdover = 0;
				}
				
				v = new VeilingBean();
				
				v.setAll(veilingId, g.getGebruikerOpID(verkoper), imgPath, titel, omschrijving, prijs, tijdover);
				
			}

			rs.close();

		} catch (SQLException se) {
			printSQLException(se);
		}
		
		return v;
	}
	
	public void createVeiling(String titel, String omschrijving, long eindTijd, double prijs, int gebruikersID, String imgPath) {

		try {
			psInsert.clearParameters();

			psInsert.setInt(1, gebruikersID);
			psInsert.setString(2, imgPath);
			psInsert.setString(3, titel);
			psInsert.setString(4, omschrijving);
			psInsert.setDouble(5, prijs);
			psInsert.setLong(6, eindTijd);
			int resultaat = psInsert.executeUpdate();
			System.out.println("RESULTAAT: "+ resultaat);
			if (resultaat == 0) {
				System.out.println("nix done");
			}
		} catch (SQLException se) {
			printSQLException(se);
		}
	}

	private void printSQLException(SQLException se) {
		while (se != null) {

			System.out.print("SQLException: State:   " + se.getSQLState());
			System.out.println("Severity: " + se.getErrorCode());
			System.out.println(se.getMessage());

			se = se.getNextException();
		}
	}
	
}
